/*
 * 查看单精度实型数的内存二进制存储
 *
 * 题目链接：https://programming.pku.edu.cn/probset/c2e9e462b33c460cb78ffd5825388e84/818bc651bb684f3abd132d4ca62da96b/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - 指针
 *   - 数的表示
 *
 * 本题提示：
 *   - 参考题目链接
 *   - 学完指针或 union 后再回来看看
 */

#include <stdio.h>
#include <stdint.h>  // for uint32_t
#include <inttypes.h>  // for PRIx32
#include <time.h>  // for time()

void solution_1(void)
{
  // 我们不用 unsigned int，而用 uint32_t，确保为 4 字节
  uint32_t u;

  // scanf 把 &u 处的 4 字节当 float 看待
  scanf("%f", (float *)&u);

  // printf 把 &u 处的 4 字节当 uint32_t 看待
  printf("%" PRIx32 "\n", u);
}

void solution_2(void)
{
  // 即提示中的方法
  float f;

  // scanf 把 &f 处的 4 字节当 float 看待
  scanf("%f", &f);

  // printf 把 &f 处的 4 字节当 uint32_t 看待
  printf("%" PRIx32 "\n", *(uint32_t *)&f);
}

void solution_3(void)
{
  union {
    float f;  // 把 &u 处的 4 字节当 float 看待
    uint32_t u;  // 把 &u 处的 4 字节当 uint32_t 看待
  } u;
  scanf("%f", &u.f);
  printf("%" PRIx32 "\n", u.u);
}

int main(void)
{
  // 我们任选一种解答来运行
  void (*solutions[])(void) = {
    solution_1,
    solution_2,
    solution_3,
  };
  size_t i = time(NULL) % (sizeof(solutions) / sizeof(solutions[0]));
  fprintf(stderr, "INFO: solution_%zu selected\n", i);
  solutions[i]();

  return 0;
}
